#include <vector>
#include <iostream>

using namespace std;



// Return if we could put `value` at (row, col) of board.
// isValidAtPosition(1, 0, 0, board)
// isValidAtPosition(1, 0, 2, board)
bool isValidAtPosition(int value, int row, int col, vector<vector<int>> &board) {
  // 1. value 是否已经在第 row 行上
  if (find(board[row].begin(), board[row].end(), value) != board.end()) {
    return false; // The value exists in board
  }

  // 2. value 是否在第 col 列上
  for (vector<int> v : board) {
    if (v[col] == value) {
      return false;
    }
  }

  // 3. value 是否在 rol,col 这个位置所属的小 9 宫格里
  int startRow = row / 3 * 3;
  int startCol = col / 3 * 3;

  for (int r = startRow; r < startRow + 3; ++r) {
    for (int c = startCol; c < startCol + 3; ++c) {
      if (board[r][c] == value) {
        return false;
      }
    }
  }

  return true;
}

int main(int argc, char const *argv[])
{
  /* code */
  vector<vector<int>> sudoku {
    {5, 3, 0, 0, 7, 0, 0, 0, 0},
    {6, 0, 0, 1, 9, 5, 0, 0, 0},
    {0, 9, 8, 0, 0, 0, 0, 6, 0},
    {8, 0, 0, 0, 6, 0, 0, 0, 3},
    {4, 0, 0, 8, 0, 3, 0, 0, 1},
    {7, 0, 0, 0, 2, 0, 0, 0, 6},
    {0, 6, 0, 0, 0, 0, 2, 8, 0},
    {0, 0, 0, 4, 1, 9, 0, 0, 5},
    {0, 0, 0, 0, 8, 0, 0, 7, 9}
  };

  /* code */
  // 找到所有包含 8 的行
  for (int i = 0; i < sudoku.size(); ++i) {
    // 每一行 sudoku[i]
    // 在 sudoku[i] 里找数字 8
    if (find(sudoku[i].begin(), sudoku[i].end(), 8) != sudoku[i].end()) {
      // 找到了
      cout << i << endl;
    }
  }

  // 找到所有包含 8 的列的编号

  // 找到所有包含 8 的小 9 宫格的编号

  // 在第一个 9 宫格里找到 8
  // 0,0 2,2
  int startRow = 0;
  int startCol = 0;

  for (; startRow <= 6; startRow += 3) {
    for (;startCol <= 6; startCol += 3) {
      // startRow
      // startCol
      // endRow = startRow + 2
      // endCol = startCol + 2
      // 在 (startRow,startCol) 到 (endRow, endCol) 之间找到 8
      for (int i = startRow; i <= startRow + 2; ++i) {
        for (int j = startCol; j <= startCol + 2; ++j) {
          if (sudoku[i][j] == 8) {
            // 如何根据 [i][j] 得到对应的九宫格编号
            if (i >= 0 && i <= 2) {
              // i,j 只可能属于编号为 1 2 3 的格子
              if (j >= 0 && j <= 2) {
                cout << 1 << endl;
              }
              else if (j >= 3 && j <= 5) {
                cout << 2 << endl;
              }
              else if (j >= 6 && j <= 8) {
                cout << 3 << endl;
              }
            }
            // 0 <= i <= 2 只属于 1 2 3 这三个格子
            // 3 <= i <= 5 只属于 4 5 6 这三个格子
            // 6 <= i <= 8 只属于 7 8 9 这三个格子
          }
        }
      }
    }
  }

  for (int i = 0; i < 3; ++i) {
    // 每一行
    for (int j = 0; j < 3; ++j) {
      // 每一列
      if (sudoku[i][j] == 8) {
        cout << 1 << endl;
      }
    }
  }
  return 0;
}
